const BASE_URL = 'http://localhost:8080/api/v1' // 开发环境
// const BASE_URL = 'https://your-domain.com/api/v1' // 生产环境

// 不需要token的白名单
const whiteList = [
  '/mini/user/send-code',
  '/mini/user/phone-login',
  '/mini/user/login'
];

// 封装网络请求
const request = (options) => {
  return new Promise((resolve, reject) => {
    const token = wx.getStorageSync('token')
    
    const header = {
      'Content-Type': 'application/json'
    };

    // 如果不在白名单中，则需要检查token
    if (!whiteList.includes(options.url)) {
      if (!token) {
        wx.showToast({
          title: '请先登录',
          icon: 'none'
        })
        reject(new Error('请先登录'))
        return
      }
      header['Authorization'] = token.startsWith('Bearer ') ? token : `Bearer ${token}`
    }

    wx.request({
      url: `${BASE_URL}${options.url}`,
      method: options.method || 'GET',
      data: options.data,
      header,
      success: (res) => {
        const { data } = res
        
        // 请求成功
        if (res.statusCode === 200) {
          // 获取响应头中的token
          const token = res.header['Authorization'] || res.header['authorization'];
          if (token) {
            // 保存token时去掉Bearer前缀
            wx.setStorageSync('token', token.replace('Bearer ', ''));
          }
          
          // 后端返回的状态码为 200 表示成功
          if (data.code === 200) {
            resolve(data)
          } else {
            // 业务错误
            wx.showToast({
              title: data.message || '请求失败',
              icon: 'none'
            })
            reject(data)
          }
        } 
        // token过期或未登录
        else if (res.statusCode === 401) {
          // 清除本地存储的token
          wx.removeStorageSync('token')
          wx.removeStorageSync('userInfo')
          wx.removeStorageSync('userId')
          
          // 如果不在白名单中，则提示登录
          if (!whiteList.includes(options.url)) {
            wx.showToast({
              title: '请先登录',
              icon: 'none'
            })
          }
          reject(data)
        }
        // 其他错误
        else {
          wx.showToast({
            title: '网络请求失败',
            icon: 'none'
          })
          reject(data)
        }
      },
      fail: (error) => {
        wx.showToast({
          title: '网络连接失败',
          icon: 'none'
        })
        reject(error)
      }
    })
  })
}

export default request
export { BASE_URL } 